var a;
var b; // 联合类型
a = 10;
// a = 11;// error
b = "female";
// b = "hi";// error
var c;
c = false;
c = "hi";
// 设置为 any 后相当于对该变量关闭了 TS 的类型检测，不建议使用
// let d: any;
var d; // 隐式的any（解析器自动判断）
d = 10;
d = "hi";
d = true;
var e;
e = 10;
e = "hi";
e = true;
var s;
// d 的类型是 any，它可以赋值给任意变量
s = d;
e = "hi";
// e 的类型是 unknown，即使赋值为 string，也不能直接赋值给其他变量
// s = e;// error
if (typeof e === "string") {
    s = e;
}
// 类型断言，可以告诉解析器变量的实际类型
/**
 * 语法：
 * 1. 变量 as 类型；
 * 2. <类型>变量。
 */
s = e;
s = e;
function fn() {
    return true;
    // return 1; // error
}
function fn2(num) {
    if (num > 0) {
        return true;
    }
    else {
        return 1;
    }
}
// void 表示空，以函数为例，就表示没有返回值的函数
function fn3() {
    return;
    // return undefined;
    // return null; // error
}
// never 表示永远不会返回结果
function fn4() {
    throw new Error("xxx");
    // return; // error
}
var f;
f = {};
f = function () { };
// 用来指定对象中可以包含哪些属性
// 语法：{ 属性名: 属性值类型 }
var g; // age 是可选的属性
// g = {};// error
g = { name: "jerry" };
// [prop: string]: any 表示任意类型的属性
var h;
h = { name: "jerry", a: 1, b: true };
// 设置函数结构的类型声明
// 语法：(形参: 类型, 形参: 类型) => 返回值类型
var i;
i = function (a, b) {
    return a + b;
};
/**
 * 数组类型声明语法：
 * 1. 类型[]；
 * 2. Array<类型>。
 */
// string[] 表示字符串数组
var j;
j = ["1", "@"];
// j = [1, "@"];// error
var k;
k = [1, 2];
/**
 * 元组：固定长度的数组 tuple
 */
var l;
l = ["hi", 123];
/**
 * enum 枚举
 */
var Gender;
(function (Gender) {
    Gender[Gender["Male"] = 0] = "Male";
    Gender[Gender["Female"] = 1] = "Female";
})(Gender || (Gender = {}));
var m;
m = {
    name: "jerry",
    gender: Gender.Male,
};
console.log(m.gender === Gender.Male); // true
// & 同时成立
var n;
n = { name: "jerry", age: 18 };
var o;
var p;
o = 1;
// o = 6; // error
